package br.com.leilao.cliente.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import br.com.leilao.cliente.model.Produto;
import br.com.leilao.util.ConectaBanco;
import br.com.leilao.util.LeilaocodeException;

public class ProdutoDao {

	private final String INSERT_QUERY = "insert into produto (nome,tipo,descricao,preco,imagem) values (?,?,?,?,?)";
	private final String UPDATE_QUERY = "update produtos set nome = ?, tipo = ?, descricao = ?, preco = ?, imagem = ? where codigo = ?";
	private final String SELECT_ALL_QUERY = "select * from produtos";
	private final String SELECT_BY_ID_QUERY = "select * from produtos where id = ? ";
	private final String DELETE_BY_ID_QUERY = "delete * from produtos where id = ? ";

	public void cadastrar(Produto ob) throws LeilaocodeException, ClassNotFoundException {
		Connection con = null;
		PreparedStatement prepStmt = null;
		try {
			con = ConectaBanco.getConnection();
			prepStmt = con.prepareStatement(INSERT_QUERY);
			prepStmt.setString(1, ob.getNome());
			prepStmt.setString(2, ob.getTipo());
			prepStmt.setString(4, ob.getDescricao());
			prepStmt.setDouble(3, ob.getPreco());
			prepStmt.setString(5, ob.getImagem());
			prepStmt.execute();
		} catch (SQLException e) {
			String msg = "[ProdutoDB][cadastrar(Produto ob)]: " + e.getMessage();
			LeilaocodeException le = new LeilaocodeException(msg, e);
			throw le;
		} finally {
			ConectaBanco.closeAll(con, prepStmt);
		}
	}

	public void atualizar(Produto ob) throws LeilaocodeException, ClassNotFoundException {
		Connection con = null;
		PreparedStatement prepStmt = null;
		try {
			con = ConectaBanco.getConnection();
			prepStmt = con.prepareStatement(UPDATE_QUERY);
			prepStmt.setString(1, ob.getNome());
			prepStmt.setString(2, ob.getTipo());
			prepStmt.setString(4, ob.getDescricao());
			prepStmt.setDouble(3, ob.getPreco());
			prepStmt.setString(5, ob.getImagem());
			prepStmt.setInt(6, ob.getCodigo());
			prepStmt.executeUpdate();
		} catch (SQLException e) {
			String msg = "[ProdutoDB][atualizar(Produto ob)]: " + e.getMessage();
			LeilaocodeException le = new LeilaocodeException(msg, e);
			throw le;
		} finally {
			ConectaBanco.closeAll(con, prepStmt);
		}
	}

	public List<Produto> listar() throws LeilaocodeException, ClassNotFoundException {
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		List<Produto> listaProdutos = new ArrayList<Produto>();
		try {
			con = ConectaBanco.getConnection();
			stmt = con.createStatement();
			rs = stmt.executeQuery(SELECT_ALL_QUERY);
			while (rs.next()) {
				int codigo = rs.getInt("codigo");
				String nome = rs.getString("nome");
				String tipo = rs.getString("tipo");
				String descricao = rs.getString("descricao");
				double preco = rs.getFloat("preco");
				String imagem = rs.getString("imagem");
				Produto p = new Produto(codigo, nome, tipo, descricao, preco,
						imagem);
				listaProdutos.add(p);
			}
		} catch (SQLException e) {
			String msg = "[ProdutoDB][listar()]: "
					+ e.getMessage();
			LeilaocodeException le = new LeilaocodeException(msg, e);
			throw le;
		} finally {
			ConectaBanco.closeAll(con, stmt, rs);
		}
		return listaProdutos;
	}

	public Produto getProdutoId(int codigo) throws LeilaocodeException, ClassNotFoundException {
		Connection con = null;
		PreparedStatement prepStmt = null;
		ResultSet rs = null;
		Produto produto = null;
		try {
			con = ConectaBanco.getConnection();
			prepStmt = con.prepareStatement(SELECT_BY_ID_QUERY);
			prepStmt.setInt(1, codigo);
			rs = prepStmt.executeQuery();
			if (rs.next()) {
				String nome = rs.getString("nome");
				String tipo = rs.getString("tipo");
				String descricao = rs.getString("descricao");
				double preco = rs.getFloat("preco");
				String imagem = rs.getString("imagem");
				produto = new Produto(codigo, nome, tipo, descricao, preco, imagem);
			}
		} catch (SQLException e) {
			String msg = "[ProdutoDB][getProdutoId(int codigo)]: " + e.getMessage();
			LeilaocodeException le = new LeilaocodeException(msg, e);
			throw le;
		} finally {
			ConectaBanco.closeAll(con, prepStmt, rs);
		}
		return produto;
	}

	public void excluir(Produto ob) throws LeilaocodeException, ClassNotFoundException, SQLException {
		Connection con = ConectaBanco.getConnection();
		PreparedStatement prepStmt = null;
		try{
			prepStmt = con.prepareStatement(DELETE_BY_ID_QUERY);
			prepStmt.setInt(1, ob.getCodigo());
			prepStmt.execute();
	   }catch(SQLException e){
		   String msg = "[ProdutoDB][excluir(Produto ob)]: " + e.getMessage();
		   LeilaocodeException le = new LeilaocodeException(msg, e);
		   throw le; 
	   }finally {
		   ConectaBanco.closeAll(con, prepStmt);
		}
	}

}
